package com.zeus.gen.base.dao;

import com.zeus.gen.base.dto.Query;
import com.zeus.gen.base.model.BaseModel;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author liuwei
 * @version 2017/9/5 下午5:41
 * @description
 * @see
 * @since 1.0
 */
public interface MyBatisDao<T extends BaseModel> {

    /**
     * 根据id查找未删除的对象
     *
     * @param clazz 定位sql namespace
     * @param id
     * @return 对象
     */
    <E> E findObjById(Class<T> clazz, Serializable id);

    /**
     * 根据条件查找对象
     *
     * @param clazz 定位sql namespace
     * @param query 查询条件
     * @param sqlId sql语句的id
     * @return 对象
     */
    <E> E findObj(Class<T> clazz, Query query, String sqlId);

    /**
     * map查询
     *
     * @param clazz
     * @param query
     * @param sqlId
     * @param mapKey 返回map的mapKey列
     * @return
     */
    <K, V> Map<K, V> findMap(Class<T> clazz, Query query, String sqlId, String mapKey);

    /**
     * 根据条件查找对象列表
     *
     * @param clazz 定位sql namespace
     * @param query 查询条件
     * @param sqlId sql语句的id
     * @param includeCount 是否包含总数查询
     * @return 对象list
     */
    <E> List<E> findList(Class<T> clazz, Query query, String sqlId, boolean includeCount);

    /**
     * 查询数量
     *
     * @param clazz 定位sql namespace
     * @param query 查询条件
     * @param sqlId 查询id
     * @return 数量
     */
    int count(Class<T> clazz, Query query, String sqlId);

    /**
     * 保存到数据库中
     *
     * @param obj
     * @param sqlId sql语句的id
     * @return 保存对象的id
     */
    int save(T obj, String sqlId);

    /**
     * 修改数据库中值
     *
     * @param obj   对象
     * @param sqlId sql语句的id
     * @return 修改记录条数
     */
    int update(T obj, String sqlId);

    /**
     * 根据入参修改数据库中值
     *
     * @param obj   对象
     * @param sqlId sql语句的id
     * @return 修改记录条数
     */
    int updateSelective(T obj, String sqlId);

    /**
     * 批量修改
     *
     * @param idList id集合
     * @param sqlId  sql语句的id
     * @return 修改条数
     */
    int batchUpdate(Class<T> clazz, List<? extends Serializable> idList, Object obj, String sqlId);

    /**
     * 硬删除
     *
     * @param clazz
     * @param id
     * @param sqlId sql语句的id
     * @return 删除记录条数
     * @throws Exception
     */
    int delete(Class<T> clazz, Serializable id, String sqlId);

    /**
     * 硬删除
     *
     * @param obj   实体对象实例
     * @param sqlId sql标识，若为空时调用delete语句
     * @return 删除对象条数
     */
    int delete(T obj, String sqlId);

}
